# 作业先完成，再完美
# 将之前封装的MyMath类中的实例方法改为静态方法, 体会两者的区别.
class MyMath:
    # 加
    @staticmethod
    def add(a, b):
        return a + b
    # 减  不加@staticmethod,方法第一参数不加self形参,只能用类名调用，但不是静态方法
    def reduce(a, b):
        return a - b
    # 乘
    # @staticmethod 加了@staticmethod,则形参不用加实例self，且一定要用类来调用
    def multip(self, a, b):
        return a * b
    # 除 加@staticmethod,方法第一参数不加self形参,用实例也能调用
    @staticmethod
    def division(a, b):
        return a / b
    # 幂
    @staticmethod
    def power(a, b):
        c = a
        b -= 1
        while b:
            c *= a
            b -= 1
        return c
    # 开方
    @staticmethod
    def sqrt(a, b):
        return a ** (1/b)

math = MyMath()
print(MyMath.add(1, 2))
print(MyMath.reduce(1, 2))
print(math.multip(1, 2))
print(math.division(1, 2))
print(MyMath.power(3, 2))
print(MyMath.sqrt(3, 2))


# 为上节课自定义类添加以下功能:
# 添加类属性
# 添加类私有属性
# 添加类方法或者类的私有属性
# 在__init__方法中初始化实例属性
# 在__init__方法中绑定私有实例属性
# 在自定义类中实现__str__, 自定义输出格式

class Humanity(object):
    language = None #类属性、实例属性
    __head = 1 #类私有属性
    __feet = 2
    __hands = 2
    def __init__(self, name, language = '不会说话'):
        self.language = language #初始化实例属性
        self.__name = name #实例的私有属性
        print(f"Ta的名字是:{self.__name}")
        print(f"{self.__name}的会语言是:{self.language}")

    @classmethod
    def get_Head(cls): #类方法
        return cls.__head

    def __str__(self):
        return f"{self.__name}会的语言是{self.language}"

cs = Humanity("陈生", '普通话')
print(f"人类有几个头：{Humanity.get_Head()}个")
print(cs)
